# -*- coding: utf-8 -*-
from collections import defaultdict
from enum import Enum

# event类
class Event(object):
    def __init__(self, event_type, **kwargs):
        self.__dict__ = kwargs
        self.event_type = event_type

    def __repr__(self):
        return ' '.join('{}:{}'.format(k, v) for k, v in self.__dict__.items())

# 事件引擎, 通过 add_listener 添加事件对应的事件处理函数
# 通过publish_event按照顺序执行对应的事件处理类
# 这样处理有一个好处, 就是可以一次性把一个事件的所有事件处理函数执行完
class EventHub(object):
    def __init__(self):
        self._listeners = defaultdict(list)

    def add_listener(self, event, listener):
        self._listeners[event].append(listener)

    def prepend_listener(self, event, listener):
        self._listeners[event].insert(0, listener)

    def publish_event(self, event):
        for l in self._listeners[event.event_type]:
            if l(event):
                break


# 枚举变量, 定义了一些事件
class EVENT(Enum):

    # 执行handle_bar函数前触发
    # pre_bar()
    BEFORE_BAR = 'before_bar'
    # 该事件会触发策略的handle_bar函数
    # bar(bar_dict)
    BAR = 'bar'
    # 执行handle_bar函数后触发
    # post_bar()
    AFTER_BAR = 'after_bar'

    BEFORE_TRADING = 'before_trading'

    AFTER_TRADING = 'after_trading'

    PENDING_ORDER = 'pending_order'

    RAW_ORDER = 'raw_order'

    ACCEPT_ORDER = 'accept_order'

    END_BACKTEST = 'end_backtest'


